/*
建造者模式（Builder Pattern）是一种创建型设计模式，它可以将复杂对象的构建过程与其表示分离，使得同样的构建过程可以创建不同的表示。

在建造者模式中，有以下几个角色：

● 产品（Product）：表示被构建的复杂对象。
● 抽象建造者（Abstract Builder）：声明了构建产品的抽象方法。
● 具体建造者（Concrete Builder）：实现了抽象建造者接口，负责具体的产品构建。
● 导演（Director）：指导具体建造者构建产品。

建造者模式的主要思想是将构建过程分解为一系列的步骤，每个步骤由具体建造者来实现。
导演负责按照一定的顺序调用具体建造者的方法来构建产品。
通过这种方式，可以灵活地组合不同的步骤，构建出不同的产品。

下面是一个使用建造者模式的C语言例程，用于构建一个简单的电脑对象：
*/

#include <stdio.h>
#include <stdlib.h>

// 产品：电脑
typedef struct
{
    char *cpu;
    char *memory;  // 临时存储
    char *storage; // 永久存储
} Computer;

// 抽象建造者
typedef struct
{
    void (*setCPU)();
    void (*setMemory)();
    void (*setStorage)();
    Computer *(*getResult)();
} Builder;

// 具体建造者
typedef struct
{
    Builder builder;
    Computer computer;
} ConcreteBuilder;

// 具体建造者的设置CPU方法
void setCPU(ConcreteBuilder *builder, const char *cpu)
{
    builder->computer.cpu = cpu;
}

// 具体建造者的设置内存方法
void setMemory(ConcreteBuilder *builder, const char *memory)
{
    builder->computer.memory = memory;
}

// 具体建造者的设置存储方法
void setStorage(ConcreteBuilder *builder, const char *storage)
{
    builder->computer.storage = storage;
}

// 具体建造者的获取结果方法
Computer *getResult(const ConcreteBuilder *builder)
{
    return &(builder->computer);
}

// 导演
typedef struct
{
    void (*construct)(Builder *builder);
} Director;

// 导演的构建方法
void construct(Builder *builder)
{
    builder->setCPU(builder, "Intel Core i7");
    builder->setMemory(builder, "8GB");
    builder->setStorage(builder, "256GB SSD");
}

int main()
{
    // 创建具体建造者和导演
    ConcreteBuilder builder;
    Director director;
    builder.builder.setCPU = setCPU;
    builder.builder.setMemory = setMemory;
    builder.builder.setStorage = setStorage;
    builder.builder.getResult = getResult;
    director.construct = construct;

    // 使用导演构建产品
    director.construct(&(builder.builder));
    Computer *computer = builder.builder.getResult(&builder);
    
    // 输出产品信息
    printf("CPU: %s\n", computer->cpu);         // 打印“CPU: Intel Core i7”
    printf("Memory: %s\n", computer->memory);   // 打印“Memory: 8GB”
    printf("Storage: %s\n", computer->storage); // 打印“Storage: 256GB SSD”

    return 0;
}

/*
在上面的例程中，定义了产品类Computer，它具有三个属性：cpu、memory和storage。
接着定义了抽象建造者接口Builder，其中声明了设置CPU、内存和存储的抽象方法，以及获取构建结果的方法。
然后，实现了具体建造者类ConcreteBuilder，其中实现了抽象建造者接口的方法。

在main函数中，首先创建具体建造者和导演对象。
然后，通过导演对象调用具体建造者的方法来构建产品。
最后，通过具体建造者的获取结果方法获取构建好的产品，并输出产品信息。

这样，通过使用建造者模式，我们可以灵活地构建不同配置的电脑对象，而不需要直接操作复杂的构建过程。
*/